// 2024.01.19 16:56  用于 注入函数的 工厂
console.log('这里是 test injectFactory');

// import { ObjectOnlyPushSet } from '../global/global';

let injectFacObj = getStaticInjectData();
// 当前所处频道
let currentChannel;

/**
 * 注射器工厂
 * -
 * 为防止 注入的函数 有相关破坏的功能 可以进行 复原 操作后的 全部属性内容 并移除 本次 注入函数
 * @param {String} channel 进入 或 新生成 一个频道
 * @return {Object} 返回一个对象包含 这几个属性 : { exposeProp, exposedProp, inject, injected }
 *
 *
 * exposeProp : 向外暴露 prop;
 *
 *
 * exposedProp : 暴露 的 prop；
 *
 *
 * inject : 注入函数;
 *
 *
 * injected : 注入 的 函数;
 */
function injectFactory(channel) {
  currentChannel = channel;
  //   console.log(channel);
  ObjectOnlyPushSet(injectFacObj, channel, initInject());
  //   console.log(injectFacObj['data']);
  return injectFacObj[channel];
}

function initInject() {
  //   let that = {};
  //   that['exposeProp'] = exposeProp.bind(that);
  //   that['injectFunc'] = injectFunc.bind(that);
  //   that['runInjectedFunc'] = runInjectedFunc.bind(that);
  //   that['getstatus'] = getstatus.bind(that);

  let that = {
    exposeProp,
    injectFunc,
    currentChannel,
    injected: runInjectedFunc,
    getstatus,
  };
  //   that.exposeProp();
  //   console.log(that);
  return that;
}

/**
 * 暴露 函数
 * @returns 接收到的 第一个参数
 */
function exposeProp() {
  //   console.log(this);
  this['valueImage'] = arguments[0];
  console.log('暴露 值 : ' + this['valueImage']);
  // return arguments[0];
}
/**
 * 注入函数 在此 进行一系列 逻辑操作
 */
function injectFunc(func) {
  console.log('注入的函数 : ' + func);
  // checkPropError;
  // rebackPropValue;
  // checkFuncError;
  this['injectfunca'] = func;
}

//   运行 注入函数
function runInjectedFunc() {
  console.log('运行 注入函数' + this['injectfunca']);
  this['injectfunca'](...arguments);
}
/**
 * 获取状态 当前是否 注入了 函数
 * @returns {Boolean}
 */
function getstatus() {
  console.log(
    '当前频道' + this['currentChannel'] + ' 注入的函数' + this['injectfunca']
  );
  return this['injectfunca'] == undefined ? false : true;
}

/**
 *
 * @returns 从 静态资源 获取的一些 注入函数 总的信息
 */
function getStaticInjectData() {
  return { data: [] };
}

/**
 * 挂载 唯一元素 并绑定 值对象
 * @param {Object|Array} objSource 目标挂载元素
 * @param {String} key 新挂载名称
 * @param {Object} obj 新 挂载 名称 的 值 对象
 * @param {String} data 挂载预定位置 默认为 "data" 需要 该预设位置为 数组
 * @returns
 */
function ObjectOnlyPushSet(objSource, key, obj, data) {
  if (data != undefined) {
    if (objSource[data] == undefined) {
      //   console.log(`sorry your ${data} is not a available prop`);
      return false;
    }
    if (objSource[data].indexOf(key) == -1) {
      objSource[data].push(key);
      if (obj != undefined) {
        objSource[key] = obj;
      }
      return true;
    }
    // console.log(`sorry your key:${key} is aready in your Object[${data}]`);
    return false;
  } else if (toStringTypeCheck(objSource['data'], 'array')) {
    if (objSource['data'].indexOf(key) == -1) {
      objSource['data'].push(key);
      if (obj != undefined) {
        objSource[key] = obj;
      }
      return true;
    }
    // console.log(`sorry your key:${key} is aready in your Object["data"]`);

    return false;
  } else {
    if (toStringTypeCheck(objSource, 'array')) {
      if (objSource.indexOf(key) == -1) {
        objSource.push(key);
      }
      return true;
    }
    // console.log(`sorry your key:${key} is aready in your Array`);

    return false;
  }
}

/**
 * @param {Object} a --数据对象
 * @param {String} type	--数据类型
 * @return {boolean}
 */
function toStringTypeCheck(a, type) {
  if (type == undefined) {
    return toString.call(a).slice(8, -1).toLowerCase();
  } else if (type.toLowerCase() == 'any') {
    return true;
  }
  // console.log(toString.call(a).slice(8, -1))
  return toString.call(a).slice(8, -1).toLowerCase() == type.toLowerCase();
}

// export { injectFactory };

// module.exports = { injectFactory };

let dispatcher = injectFactory('channel0');
let receiver = injectFactory('channel0');
module.exports = { dispatcher, receiver };
